/**
 * 重写XMLHttpRequest的open和send方法，用于收集请求性能数据并上报
 */
function overwriteOpenAndSend() {
  /**
   * 重写XMLHttpRequest.prototype.open方法
   * @param {...any} args - 原open方法的参数数组
   *   args[0] {string} method - HTTP请求方法（GET/POST等）
   *   args[1] {string} url - 请求的URL地址
   */
  orginalProto.open = function newOpen(...args) {
    // 存储请求方法和URL到XMLHttpRequest实例上
    this.method = args[0];
    this.url = args[1];
    // 调用原始open方法保持原有功能
    orginalOpen.apply(this, args);
  };

  /**
   * 重写XMLHttpRequest.prototype.send方法
   * @param {...any} args - 原send方法的参数数组
   */
  orginalProto.send = function newSend(...args) {
    // 记录请求开始时间
    this.startTime = Date.now();

    const onLoaded = () => {
      // 计算请求耗时
      this.endTime = Date.now();
      this.duration = this.startTime - this.endTime;

      // 构建性能上报数据对象
      const { url, method, startTime, endTime, duration, status } = this;
      const reportData = {
        type: "performance",
        subType: "xhr",
        status,
        success: status >= 200 && status < 400,
        url,
        method,
        startTime,
        endTime,
        duration,
      };

      // 上报性能数据
      lazyReportBatch(reportData);
      // 清理事件监听
      this.removeEventListener("loaded", onLoaded, true);
    };

    // 监听请求完成事件
    this.addEventListener("loaded", onLoaded, true);
  };
}

/**
 * 初始化XMLHttpRequest监控的入口函数
 */
export default function xhr() {
  overwriteOpenAndSend();
}
